/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.persistencia;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import modelo.Usuario;

/**
 *
 * @author Joseph Tello Wong
 */
public class BIN {

    private String ruta_archivo = ".//archivo.dat";
    private String ruta_archivo_usuariosBD = ".//archivoUsuarios.dat";

    public BIN() {
    }

    //Leer y escribir para el usuario del monitor
    public boolean escribir(Object objeto) {
        try {
            ObjectOutputStream file = new ObjectOutputStream(new FileOutputStream(this.ruta_archivo));
            file.writeObject(objeto);
            file.close();
            return true;
        } catch (IOException ex) {
            System.out.println(ex);
            return false;
        }
    }

    public Object leer() {
        Object objeto = new Object();
        try {
            ObjectInputStream file = new ObjectInputStream(new FileInputStream(this.ruta_archivo));
            objeto = file.readObject();
            file.close();
            System.out.println("Objeto leido -> " + objeto.toString());
        } catch (ClassNotFoundException ex) {
            System.out.println(ex);
        } catch (IOException ex) {
            System.out.println(ex);
        }
        return objeto;
    }

    //Leer y escribir para los usuarios de la base de datos
    public void sobreescribirUsuarios(Usuario usuario) throws ClassNotFoundException, IOException {

        List<Object> usuarios = new ArrayList<>();
        Object aux = new Object();
        ObjectInputStream fileInput = new ObjectInputStream(new FileInputStream(this.ruta_archivo_usuariosBD));

        aux = fileInput.readObject();
        while (aux != null) {
            if (aux instanceof Usuario) {
                if ((((Usuario) aux).getUser()).equals(usuario.getUser())) {
                    usuarios.add(usuario);
                } else {
                    usuarios.add(aux);
                }
                try {
                    aux = fileInput.readObject();
                } catch (IOException ex) {
                    aux = null;
                    System.out.println("Fin de fichero.");
                }
            }
        }
        fileInput.close();

        ObjectOutputStream fileOutput = new ObjectOutputStream(new FileOutputStream(this.ruta_archivo_usuariosBD));
//        fileOutput.writeObject(usuarios.get(0));
//        fileOutput.close();
//        
//        fileOutput = new ObjectOutputStream(new FileOutputStream(this.ruta_archivo_usuariosBD));
        for (int i = 0; i < usuarios.size(); i++) {
            aux = usuarios.get(i);
            fileOutput.writeUnshared(aux);
        }
        fileOutput.close();

    }

    public boolean escribirUsuarios(List<Usuario> usuarios) throws ClassNotFoundException {
        try {
//            List<Object> usuariosPresentes = new ArrayList<>();
//            Object aux = new Object();
//            ObjectInputStream fileInput = new ObjectInputStream(new FileInputStream(this.ruta_archivo_usuariosBD));
//
//            aux = fileInput.readObject();
//            while (aux != null) {
//                if (aux instanceof Usuario) {
//                    usuariosPresentes.add(aux);
//                    try {
//                        aux = fileInput.readObject();
//                    } catch (IOException ex) {
//                        aux = null;
//                        System.out.println("Fin de fichero.");
//                    }
//                }
//            }
//            fileInput.close();

            Object obj = new Object();
            ObjectOutputStream fileOutput = new ObjectOutputStream(new FileOutputStream(this.ruta_archivo_usuariosBD));
            Object esta = new Object();
            for (Usuario user : usuarios) {
//                esta = this.estaEnLista(usuariosPresentes, user.getUser());
//                System.out.println("Objeto: " + esta.toString());
                obj = user;
                //if (esta == null) {
                fileOutput.writeUnshared(obj);
                //} else {
//                    fileOutput.writeUnshared(esta);
//                }
            }
            fileOutput.close();
            return true;
        } catch (IOException ex) {
            System.out.println(ex);
            return false;
        }
    }

    public Usuario leer(Usuario usuario) throws ClassNotFoundException, IOException {
        Usuario usuarioFinal = new Usuario();
        String desc = "";
        Object aux = new Object();
        ObjectInputStream fileInput = new ObjectInputStream(new FileInputStream(this.ruta_archivo_usuariosBD));
        aux = fileInput.readObject();
        while (aux != null) {
            if (aux instanceof Usuario) {
                if ((((Usuario) aux).getUser()).equals(usuario.getUser())) {
                    System.out.println("Leyendo1: " + ((Usuario) aux).getUser() + ((Usuario) aux).getDescripcion());
                    desc = ((Usuario) aux).getDescripcion();
                    usuarioFinal = (Usuario) aux;
                } else {
                    usuarioFinal = usuario;
                }
                try {
                    aux = fileInput.readObject();
                } catch (IOException ex) {
                    aux = null;
                    System.out.println("Fin de fichero.");
                }
            }
        }
        fileInput.close();
        System.out.println("Objeto leido -> " + usuarioFinal.getUser() + usuarioFinal.getDescripcion());
        usuarioFinal.setDescripcion(desc);
        return usuarioFinal;
    }

    public Object estaEnLista(List<Object> usuarios1, String usuario) {
        for (Object aux : usuarios1) {
            if (((Usuario) aux).getUser().equals(usuario)) {
                return aux;
            }
        }
        return null;
    }
}
